# -*- coding: utf-8 -*-
import datetime
import random
import uuid
import time


def _hex36(num):
    """
    10进制转换36进制
    :param num:
    :return:
    """
    # 正常36进制字符应为'0123456789abcdefghijklmnopqrstuvwxyz'，这里我打乱了顺序
    key='t5hrwop6ksq9mvfx8g3c4dzu01n72yeabijl'
    a = []
    while num != 0:
        a.append(key[num%36])
        num = num / 36
    a.reverse()
    out = ''.join(a)
    return out


def get_id():
    """
    100并发，440次重复
    #获取唯一标识
    6进制位数对应10进制数范围参考：
    #1位：0-35
    #2位：36-1295
    #3位：1296-46655
    #4位：46656-1679615
    #5位：1679616-60466175
    #6位：60466176-2176782335
    :return:
    """
    # 只要秒数大于60466175，就可以转换出6位的36进制数，这里从2015年1月1日开始计算，约70年后会变成7位
    d1 = datetime.datetime(2015, 1, 1)
    d2 = datetime.datetime.now()
    # 获取秒数
    s = (d2-d1).days*24*60*60
    # 获取微秒数
    ms = d2.microsecond
    # 随机两位字符串
    id1 = _hex36(random.randint(36, 1295))
    # 转换秒数
    id2 = _hex36(s)
    # 转换微秒数，加46656是为了保证达到4位36进制数
    id3 = _hex36(ms+46656)

    m_id=id1+id2+id3
    return m_id[::-1]


def get_hash_id(prefix=None):
    """
    进程模式，100并发，2次重复
    :return:
    """
    if prefix is None:
        prefix = ''
    id_str = str(uuid.uuid1()).replace('-', '')
    hashcode = hash(id_str)
    if hashcode < 0:
        hashcode = 0 - hashcode
    return prefix + str(hashcode).zfill(20)


def get_hash_id_enhance(prefix=None):
    """
    进程模式，100并发，0次重复
    :return:
    """
    if prefix is None:
        prefix = ''
    id_str = str(uuid.uuid1()).replace('-', '')
    hashcode = hash(id_str)
    if hashcode < 0:
        hashcode = 0 - hashcode
    return prefix + str(hashcode).zfill(20) + _get_zfill_random_number(2) + _get_zfill_random_number(2)


def get_notice_src_id(prefix=None):
    """
    进程模式，100并发，1997重复
    :param prefix:
    :return:
    """
    if prefix is None:
        prefix = ''
    t = time.time()
    t_n = int(round(t * 1000))
    return prefix + str(t_n) + _get_zfill_random_number(3) + _get_zfill_random_number(3)


def get_notice_src_id_enhance(prefix=None):
    """
    进程模式，100并发，6位随机数，6重复
    7位随机数，0重复
    将精度提升到0.001ms, 即 ns级别
    :param prefix:
    :return: 26位字符串
    """
    if prefix is None:
        prefix = ''
    t_str = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")[2:]
    return prefix + t_str + _get_zfill_random_number(4) + _get_zfill_random_number(3)


def _get_random_number(from_num, to_num=100):
    return random.randint(from_num, to_num)


def _get_zfill_random_number(n):
    width = n
    if width < 1:
        width = 1
    s = "1"
    for i in range(1, width):
        s += "0"
    to_num = int(s)
    r = _get_random_number(0, to_num)
    return str(r).zfill(width)
